home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / kcl / akcl / akcl1615.lha / mp / mp_sl3todivul3.c < prev    next >
Text File  |  1991-08-20  |  2KB  |  91 lines

  1. #define ulong unsigned long
  2. #define shift1BitRight(h,l) \
  3.   (l = l >> 1 , (h & 1 ? l = l | (1 << (WORD_SIZE -1))   : 0),  h = h >> 1)
  4.  
  5. #define shift2BitRight(h,l) \
  6.   (l = l >> 2 , (h & 3 ? l = l | ((h & 3) << (WORD_SIZE -2))   : 0),  h = h >> 2)
  7.  
  8. #define addll(x,y) \
  9.        (Xtx=(x),Xty=(y), Xtres = Xtx+Xty, \
  10.          (Xtres < Xtx ? overflow = 1 :0), Xtres)
  11.  
  12. /* the following defines divul3 in terms of divsl3.
  13.  */   
  14.    
  15.  
  16. #define WORD_SIZE 32
  17. divul3(x, y, hi)
  18.     ulong           x, y, *hi;
  19. {
  20.     ulong           q = 0,Xtx,Xty,Xtres,addy,overflow;
  21.     ulong           h = *hi, l = x, hibit;
  22.     ulong           dd;
  23.     /* if (y<=h) printf("error: the quotient will be more than 32 bits"); */
  24.     
  25.     if ((int) y > 0) {
  26.         dd = y >> 1;
  27.         if (dd <= h) {
  28.             unsigned int    ll = l;
  29.             shift1BitRight(h, ll);
  30.             q = divsl3(ll, y, &h);
  31.             h = h + h + (l & 1);
  32.             q = q + q;
  33.             if (h >= y) {
  34.                 q++;
  35.                 h -= y;
  36.             }
  37.             *hi = h;
  38.             return q;
  39.         } else {
  40.             return divsl3(x, y, hi);
  41.         }
  42.     }
  43.     /* negative */
  44.     {
  45.         ulong           ll;
  46.         ulong           rem;
  47.         ll = l;
  48.         shift2BitRight(h, ll);
  49.         dd = y >> 1;
  50.         q = divsl3(ll, dd, &h);
  51.         rem = h + h;
  52.         overflow = 0;
  53.         rem = addll(rem, rem);
  54.         rem += l & 3;
  55.         q = q + q;
  56.         addy = 0;
  57.         if (y & 1) {
  58.           if (overflow==0 && rem < q)
  59.             { addy = 1;
  60.               rem = addll(rem, y);
  61.               if (overflow==0 && rem < q)
  62.             { addy = 2;
  63.               rem +=y;
  64.             }
  65.             }
  66.              if (q > rem ) overflow = 0;
  67.           rem -= q;
  68.         }
  69.         if (addy > 0)
  70.           { q -= addy; }
  71.         else
  72.           { if (overflow || (rem >= y))
  73.               { rem -= y;
  74.             q++;
  75.               }
  76.           }
  77.             
  78.         *hi = rem;
  79.         return q;
  80.     }
  81. }
  82.  
  83.  
  84. /*
  85.  ;;- Local variables:
  86.  ;;- mode:c
  87.  ;;- version-control:t
  88.  ;;- End: 
  89.  
  90.  */
  91.